﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinCmdBus
{
	//public class DispatchingServices<TController> : IInterceptor where TController : IController
	//{
	//    public DispatchingServices()
	//    {
	//        ViewCache = new Dictionary<string, ViewPanelBase<TController>>();
	//    }

	//    public TController Controller { get; set; }
	//    public Dictionary<string, ViewPanelBase<TController>> ViewCache { get; private set; }
	//    public Form RootView { get; set; }
	//    public Assembly ViewAssmebly { get; set; }

	//    public void Run()
	//    {
	//        RootView.Load += delegate
	//        {
	//            Controller.DisplayFirstView();
	//        };
			 
	//        PrimeViewCache(ViewAssmebly);
	//        Application.Run(RootView);
	//    }

	//    public ActionResult DispatchAction(Func<ActionResult> action)
	//    {
	//        var task = new Task(() =>
	//        {
	//            var actionResult = action();
	//            var view = FindView(actionResult);
	//            RootView.SyncWithUI(() =>
	//            {
	//                view.BindModel(actionResult.Model);
	//            });
	//        });

	//        return null;
	//    }

	//    public void PrimeViewCache(Assembly viewAssembly)
	//    {
	//        ViewCache = 
	//            viewAssembly
	//                .GetTypes().Where(t => t.BaseType == typeof(ViewPanelBase<TController>))
	//                .ToDictionary(t => t.Name.ToLower(), t => 
	//                {
	//                    var view = Activator.CreateInstance(t) as ViewPanelBase<TController>;
	//                    view.Left = 11;
	//                    view.Top = 129;
	//                    view.Controller = Controller;
	//                    return view;
	//                });
	//    }

	//    private ViewPanelBase<TController> FindView(ActionResult actionResult)
	//    {
	//        var key = actionResult.View.ToLower();
	//        key = key.EndsWith("view") ? key : key + "view";

	//        if (ViewCache.ContainsKey(key))
	//        {
	//            return ViewCache[key];
	//        }
	//        else
	//        {
	//            throw new InvalidOperationException("All views should be pre-cached");
	//        }
	//    }

	//    #region IInterceptor Members

	//    public void Intercept(IInvocation invocation)
	//    {
	//        if (invocation.Method.ReturnType == typeof(ActionResult))
	//        {
	//            var task = new Task(() =>
	//            {
	//                invocation.Proceed();
	//                var actionResult = invocation.ReturnValue as ActionResult;
	//                var view = FindView(actionResult);
	//                RootView.SyncWithUI(() =>
	//                {
	//                    view.BindModel(actionResult.Model);
	//                });
	//            });

	//            task.Start();
	//        }
	//        else
	//        {
	//            invocation.Proceed();
	//        }
	//    }

	//    #endregion
	//}
}
